Background


Data Collection

Plots were sampled at 27 independent sites throughout a subset of the Eastern Highland Rim ecoregion.

Sites had differing dominant vegetation types; click the points below for details. Also note that some sites were also in close proximity, making them difficult to see at broader zoom levels.

Sites had differing dominant vegetation types; click the points below for details. Also note that some sites were also in close proximity, making them difficult to see at broader zoom levels.

1031 1m^2 quadrats were sampled with differeing sample sizes per site based on the size of the site.

Data Configuration

Nearly all statistical packages require the data to be in a presence-absence form. There are several ways to do it (one of which can maintain cover values rather than changing it to binary data); I used a loop function. The result is a presence-absence matrix with Site as a column so subsamples can be organized accordingly.

Table 1. Sample of data in presence-absence format.
Site SCICYP PROPEC JUNDEB JUNREP CXJOOR CXLOUI
1.1.1 1 1 1 1 1 1 0
1.1.2 1 1 1 1 0 0 1
1.1.3 1 1 1 0 0 0 1
1.1.4 1 1 1 0 0 1 1
1.1.5 1 0 0 0 0 0 1

Diversity

Sites had widely varying observed total richness. The use of extrapolated species accumulation curves can tell us how many species are likely to be at the site based on how many were found in accumulating subsamples. However if a curve never flattens, it gives a wild estimate of richness (see Site 10).

What do the curves that made these estimates look like? Let’s take a look!

This plot is not particularly helpful other than to visualize the general span of observed and expected richnesses and sampling efforts. Examining the curves in portions of 3-4 is necessary to

These curves illustrate not only where the flattening point (expected richness) occurs, but also how quickly. Examining a curve can allow someone to estimate how many more samples would be needed to reach that point, however if doing so samples a larger area then the curve may never flatten.

Let’s see if sampling effort (# quadrats/area sampled) affected percent estimated sampling completion; if it did, that would be a big problem and I would have a lot of explaining to do to my committee.

There is no relationship between sampling effort and completion percentage (p=0.6366006). However, note that Sites 10 and 26 were flagged as outliers by the autoplot function. This inadequate sampling is likely the result of too few quadrats sampled at the wetland edge relative to the size of the wetland.

Evenness and Dominance


There appears to be a relationship between site richness and site area, but unexpectedly this relationship appears to be negative. Because the data are likely non-linear, a generalized linear model should be used to assess this relationship.

Communities

Which sites are similar?

There may be a lot of overlap in clusters due to the nestedness of some community types. We should revisit this later using quadrats as replicates.

Are sites similar because they’re geographically closer?


Call:
glm(formula = Sorensen ~ geographic, family = binomial, data = distance.f)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.13785  -0.13608   0.02589   0.19654   0.64852  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) 1.427e+00  1.626e-01   8.777   <2e-16 ***
geographic  6.933e-07  1.764e-06   0.393    0.694    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 43.121  on 701  degrees of freedom
Residual deviance: 42.966  on 700  degrees of freedom
AIC: 298.02

Number of Fisher Scoring iterations: 4

Ordinations

Implications

Plant communities aren’t real. We can all go home now.

LS0tDQp0aXRsZTogIkRldGVybWluaXN0aWMgcHJvY2Vzc2VzIGRyaXZlIHdldGxhbmQgcGxhbnQgY29tbXVuaXR5IGNvbXBvc2l0aW9uIGFuZCBkaXZlcnNpdHkiDQphdXRob3I6ICJDLiBNLiBDaWFmcmUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIGh0bWxfbm90ZWJvb2s6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIHJvd3MucHJpbnQ6IDEwDQogICAgdGhlbWU6IGpvdXJuYWwNCi0tLQ0KIyAgIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCmBgYHtyIHNldHVwLCBOT1RJQ0UgVVNFIG9mIFBBQ01BTiwgaW5jbHVkZT1GQUxTRX0NCiNpbnN0YWxsIHBhY21hbiBmaXJzdCB0byBhdXRvbWF0aWNhbGx5IGluc3RhbGwgYW5kIGxvYWQgYW55IG5lZWRlZCBwYWNrYWdlcw0KcGFjbWFuOjpwX2xvYWQoZ2dwbG90MiwgZHBseXIsIHRpZHlyLCByZXNoYXBlLCBpTkVYVCwga25pdHIsIGthYmxlRXh0cmEsIGdnZm9ydGlmeSwgZ2dwdWJyLCB2ZWdhbiwgZ2Vvc3BoZXJlLCBtY2x1c3QsIHJnZGFsLCBsZWFmbGV0KQ0KDQojTm90IHN1cmUgd2h5IEkga2VlcCB0aGlzIGluDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQoNCiNMb2FkIGRhdGENCnNwcHhzaXRlczwtcmVhZC5jc3YoImRhdGEvVkVHREFUQURPTkUuY3N2IiwgaGVhZGVyPVRSVUUpDQpzaXRlbmFtZXM8LXJlYWQuY3N2KCJkYXRhL1NpdGVOYW1lcy5jc3YiLCBoZWFkZXI9VFJVRSkNCnNpdGVzaXplczwtcmVhZC5jc3YoImRhdGEvU2l0ZVhzaXplMi5jc3YiLCBoZWFkZXI9VFJVRSkNCnF1YWRkYXRhczwtcmVhZC5jc3YoImRhdGEvcXVhZG1ldHJpY3MuY3N2IiwgaGVhZGVyPVRSVUUpDQpjb2xuYW1lcyhxdWFkZGF0YXMpW2NvbG5hbWVzKHF1YWRkYXRhcyk9PSJEZXB0aC4ubS4iXSA8LSAiRGVwdGgiDQpjb2xuYW1lcyhxdWFkZGF0YXMpW2NvbG5hbWVzKHF1YWRkYXRhcyk9PSJYLi5DYW5vcHkiXSA8LSAiQ2Fub3B5Ig0KY29sbmFtZXMocXVhZGRhdGFzKVtjb2xuYW1lcyhxdWFkZGF0YXMpPT0iUG9uZCJdIDwtICJTaXRlIg0Kc2l0ZV9wb2ludHMgPC0gc2VsZWN0KHNpdGVzaXplcywgYygiU2l0ZSIsICJMYXRpdHVkZSIsICJMb25naXR1ZGUiKSkNCiNOb3RlOiB0aGVyZSBpcyBubyBTaXRlIDE1OyBpdCB3YXMgZGl0Y2hlZCBoYWxmd2F5IHRocm91Z2ggc2FtcGxpbmcgYmVjYXVzZSBpdCB3YXMgbm90IGluZGVwZW5kZW50IGZyb20gU2l0ZSAxNC4NCmBgYA0KDQojIyBCYWNrZ3JvdW5kIA0KDQo8ZmlndXJlPg0KPGltZyBzcmM9IkltYWdlcy9RdWFkcmF0Q3JvcHBlZC5qcGciPjwvZmlndXJlPjxicj4NCg0KIyMjIERhdGEgQ29sbGVjdGlvbg0KDQpQbG90cyB3ZXJlIHNhbXBsZWQgYXQgMjcgaW5kZXBlbmRlbnQgc2l0ZXMgdGhyb3VnaG91dCBhIHN1YnNldCBvZiB0aGUgRWFzdGVybiBIaWdobGFuZCBSaW0gZWNvcmVnaW9uLiANCmBgYHtyIFN0YXRpYyBtYXAgcHJlcCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCkVIUmEgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Eua21sIikNCkVIUmIgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Iua21sIikNCkVIUmMgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Mua21sIikNCkVIUmQgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Qua21sIikNCkVIUmUgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Uua21sIikNCkVIUmYgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2Yua21sIikNCkVIUmcgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2cua21sIikNCkVIUmggPC0gcmVhZE9HUigiTWFwcHlCaXRzL2gua21sIikNCkVIUmkgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2kua21sIikNCkVIUmogPC0gcmVhZE9HUigiTWFwcHlCaXRzL2oua21sIikNCkVIUmsgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2sua21sIikNCkVIUmwgPC0gcmVhZE9HUigiTWFwcHlCaXRzL2wua21sIikNCg0Kb3V0bGluZV9wb2ludHNhIDwtIEVIUmFAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNhKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lYSA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzYSkNCnNwX291dGxpbmVhIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWEpLDEpDQpvdXRsaW5lX3BvbHlhIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVhKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWEpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNiIDwtIEVIUmJAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNiKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lYiA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzYikNCnNwX291dGxpbmViIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWIpLDEpDQpvdXRsaW5lX3BvbHliIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmViKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWIpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNjIDwtIEVIUmNAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNjKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lYyA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzYykNCnNwX291dGxpbmVjIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWMpLDEpDQpvdXRsaW5lX3BvbHljIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVjKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWMpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNkIDwtIEVIUmRAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNkKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lZCA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzZCkNCnNwX291dGxpbmVkIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWQpLDEpDQpvdXRsaW5lX3BvbHlkIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVkKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWQpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNlIDwtIEVIUmVAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNlKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lZSA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzZSkNCnNwX291dGxpbmVlIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWUpLDEpDQpvdXRsaW5lX3BvbHllIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVlKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWUpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNmIDwtIEVIUmZAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNmKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lZiA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzZikNCnNwX291dGxpbmVmIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWYpLDEpDQpvdXRsaW5lX3BvbHlmIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVmKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWYpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNnIDwtIEVIUmdAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNnKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lZyA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzZykNCnNwX291dGxpbmVnIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWcpLDEpDQpvdXRsaW5lX3BvbHlnIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVnKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWcpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNoIDwtIEVIUmhAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNoKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5laCA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzaCkNCnNwX291dGxpbmVoIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWgpLDEpDQpvdXRsaW5lX3BvbHloIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVoKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWgpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNpIDwtIEVIUmlAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNpKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5laSA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzaSkNCnNwX291dGxpbmVpIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWkpLDEpDQpvdXRsaW5lX3BvbHlpIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVpKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWkpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNqIDwtIEVIUmpAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNqKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5laiA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzaikNCnNwX291dGxpbmVqIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWopLDEpDQpvdXRsaW5lX3BvbHlqIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVqKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWopIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNrIDwtIEVIUmtAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNrKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5layA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzaykNCnNwX291dGxpbmVrIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWspLDEpDQpvdXRsaW5lX3BvbHlrIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVrKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWspIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCg0Kb3V0bGluZV9wb2ludHNsIDwtIEVIUmxAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkcw0KY29sbmFtZXMob3V0bGluZV9wb2ludHNsKSA8LSBjKCJYIiwiWSIpDQpvdXRsaW5lbCA8LSBQb2x5Z29uKG91dGxpbmVfcG9pbnRzbCkNCnNwX291dGxpbmVsIDwtIFBvbHlnb25zKGxpc3Qob3V0bGluZWwpLDEpDQpvdXRsaW5lX3BvbHlsIDwtIFNwYXRpYWxQb2x5Z29ucyhsaXN0KHNwX291dGxpbmVsKSkNCnByb2o0c3RyaW5nKG91dGxpbmVfcG9seWwpIDwtIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK2VsbHBzPVdHUzg0IikNCmBgYA0KDQpTaXRlcyBoYWQgZGlmZmVyaW5nIGRvbWluYW50IHZlZ2V0YXRpb24gdHlwZXM7IGNsaWNrIHRoZSBwb2ludHMgYmVsb3cgZm9yIGRldGFpbHMuIEFsc28gbm90ZSB0aGF0IHNvbWUgc2l0ZXMgd2VyZSBhbHNvIGluIGNsb3NlIHByb3hpbWl0eSwgbWFraW5nIHRoZW0gZGlmZmljdWx0IHRvIHNlZSBhdCBicm9hZGVyIHpvb20gbGV2ZWxzLg0KYGBge3IgU3RhdGljIG1hcCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnN0YXRlIDwtIG1hcF9kYXRhKCJzdGF0ZSIpDQpjb3VudHkgPC0gbWFwX2RhdGEoImNvdW50eSIpDQoNCg0KdG4gPC0gY291bnR5ICU+JSANCiAgZmlsdGVyKHJlZ2lvbj09InRlbm5lc3NlZSIpDQpreSA8LSBjb3VudHkgJT4lIA0KICBmaWx0ZXIocmVnaW9uPT0ia2VudHVja3kiKQ0KYWwgPC0gY291bnR5ICU+JSANCiAgZmlsdGVyKHJlZ2lvbj09ImFsYWJhbWEiKQ0KDQoNCmdncGxvdCgpICsgIA0KICBnZW9tX3BvbHlnb24oZGF0YSA9IHN0YXRlLCBhZXMoeD1sb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLCBjb2xvcj0iYmxhY2siKSArDQogIGdlb21fcG9seWdvbihkYXRhID0gdG4sIGFlcyh4PWxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yPSJibGFjayIpICsNCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBreSwgYWVzKHg9bG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCksDQogICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIndoaXRlIiwgY29sb3I9ImJsYWNrIikgKw0KICBnZW9tX3BvbHlnb24oZGF0YSA9IGFsLCBhZXMoeD1sb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLCBjb2xvcj0iYmxhY2siKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWEsIGFlcyh4PW91dGxpbmVfcG9seWFAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5YUBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWIsIGFlcyh4PW91dGxpbmVfcG9seWJAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5YkBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWMsIGFlcyh4PW91dGxpbmVfcG9seWNAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5Y0Bwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWQsIGFlcyh4PW91dGxpbmVfcG9seWRAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5ZEBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWUsIGFlcyh4PW91dGxpbmVfcG9seWVAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5ZUBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWYsIGFlcyh4PW91dGxpbmVfcG9seWZAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5ZkBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWcsIGFlcyh4PW91dGxpbmVfcG9seWdAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5Z0Bwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWgsIGFlcyh4PW91dGxpbmVfcG9seWhAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5aEBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWksIGFlcyh4PW91dGxpbmVfcG9seWlAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5aUBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWosIGFlcyh4PW91dGxpbmVfcG9seWpAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5akBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWssIGFlcyh4PW91dGxpbmVfcG9seWtAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5a0Bwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9seWdvbihkYXRhPW91dGxpbmVfcG9seWwsIGFlcyh4PW91dGxpbmVfcG9seWxAcG9seWdvbnNbWzFdXUBQb2x5Z29uc1tbMV1dQGNvb3Jkc1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9b3V0bGluZV9wb2x5bEBwb2x5Z29uc1tbMV1dQFBvbHlnb25zW1sxXV1AY29vcmRzWywyXSksDQogICAgICAgICAgICAgICBhbHBoYSA9IC44LCBmaWxsPSJvcmFuZ2UiKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHNpdGVfcG9pbnRzLCBhZXMoeD1Mb25naXR1ZGUseT1MYXRpdHVkZSksIGNvbG9yPSJibGFjayIpICsNCiAgY29vcmRfZml4ZWQoeGxpbSA9IGMoLTkwLjUsIC04MiksICB5bGltID0gYygzNC41LCAzNy42KSwgcmF0aW8gPSAxLjIpICsNCiAgeGxhYigiTG9uZ2l0dWRlIikgKyB5bGFiKCJMYXRpdHVkZSIpICsgZ2d0aXRsZSgiRWFzdGVybiBIaWdobGFuZCBSaW0gc3Vic2V0IChnb2xkKSBhbmQgc3R1ZHkgc2l0ZXMiKQ0KDQojIGdlb21fbWFwKGRhdGEgPSBkYXRhLCBtYXAgPSBtYXAsIGFlcyhtYXBfaWQgPSBjb3VudHJpZXMsIGZpbGwgPSBjb2xvcikpIA0KYGBgDQoNClNpdGVzIGhhZCBkaWZmZXJpbmcgZG9taW5hbnQgdmVnZXRhdGlvbiB0eXBlczsgY2xpY2sgdGhlIHBvaW50cyBiZWxvdyBmb3IgZGV0YWlscy4gQWxzbyBub3RlIHRoYXQgc29tZSBzaXRlcyB3ZXJlIGFsc28gaW4gY2xvc2UgcHJveGltaXR5LCBtYWtpbmcgdGhlbSBkaWZmaWN1bHQgdG8gc2VlIGF0IGJyb2FkZXIgem9vbSBsZXZlbHMuDQpgYGB7ciBMZWFmbGV0IG1hcCwgZWNobz1GQUxTRX0NCmxlYWZsZXQoZGF0YT1zaXRlc2l6ZXMpJT4lDQogIHNldFZpZXcoLTg1Ljg3MjM3LCAzNS43ODE2NSwgem9vbT03KSU+JSANCiAgYWRkVGlsZXMoKSU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBzaXRlc2l6ZXMsIGxhdCA9IH5MYXRpdHVkZSwgbG5nID0gfkxvbmdpdHVkZSwNCiAgICAgICAgICAgICAgICAgICBsYWJlbCA9IH5TaXRlLA0KICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfkNvbW11bml0eSwNCiAgICAgICAgICAgICAgICAgICBvcGFjaXR5PSA1LA0KICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IDIsDQogICAgICAgICAgICAgICAgICAgY29sb3I9ICJwdXJwbGUiLA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IH43KSU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRFc3JpLk5hdEdlb1dvcmxkTWFwLCBncm91cCA9ICJOYXRHZW8iKSU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRFc3JpLldvcmxkSW1hZ2VyeSwgZ3JvdXAgPSAiRVNSSSIpICU+JQ0KICBhZGRNaW5pTWFwKHpvb21MZXZlbE9mZnNldCA9IC00KSU+JQ0KICBhZGRTY2FsZUJhcigpJT4lDQogIGFkZExheWVyc0NvbnRyb2woDQogICAgYmFzZUdyb3VwcyA9IGMoIk5hdEdlbyIsICJFU1JJIiksDQogICAgb3B0aW9ucyA9IGxheWVyc0NvbnRyb2xPcHRpb25zKGNvbGxhcHNlZCA9IEZBTFNFKSkNCmBgYA0KDQoxMDMxIDFtXjIgcXVhZHJhdHMgd2VyZSBzYW1wbGVkIHdpdGggZGlmZmVyZWluZyBzYW1wbGUgc2l6ZXMgcGVyIHNpdGUgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIHNpdGUuIA0KDQojIyMgRGF0YSBDb25maWd1cmF0aW9uDQoNCk5lYXJseSBhbGwgc3RhdGlzdGljYWwgcGFja2FnZXMgcmVxdWlyZSB0aGUgZGF0YSB0byBiZSBpbiBhIHByZXNlbmNlLWFic2VuY2UgZm9ybS4gVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBkbyBpdCAob25lIG9mIHdoaWNoIGNhbiBtYWludGFpbiBjb3ZlciB2YWx1ZXMgcmF0aGVyIHRoYW4gY2hhbmdpbmcgaXQgdG8gYmluYXJ5IGRhdGEpOyBJIHVzZWQgYSBsb29wIGZ1bmN0aW9uLiBUaGUgcmVzdWx0IGlzIGEgcHJlc2VuY2UtYWJzZW5jZSBtYXRyaXggd2l0aCBTaXRlIGFzIGEgY29sdW1uIHNvIHN1YnNhbXBsZXMgY2FuIGJlIG9yZ2FuaXplZCBhY2NvcmRpbmdseS4gDQoNCmBgYHtyIExvb3AgbWFnaWMsIGNhY2hlPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpzaXRlc19zdWI8LXVuaXF1ZShzcHB4c2l0ZXMkSUQpDQpzcHBfc3ViPC11bmlxdWUoc3BweHNpdGVzJFNwZWNpZXMpDQoNCiNNYWtlIGEgbWF0cml4IHdpdGggbG9vcCBmdW5jdGlvbg0Kc3BwX2NvbW1hdCA8LSBtYXRyaXgoMCwgbGVuZ3RoKHNpdGVzX3N1YiksIGxlbmd0aChzcHBfc3ViKSkNCmZvciAoaSBpbiAxOm5yb3coc3BwX2NvbW1hdCkpe3RlbXBfc2l0ZXMgPC0gc3BweHNpdGVzW3doaWNoKHNwcHhzaXRlcyRJRCA9PSBzaXRlc19zdWJbaV0pLF0NCiAgc3BwX2NvbW1hdFtpLCB3aGljaChzcHBfc3ViJWluJXRlbXBfc2l0ZXMkU3BlY2llcyldPC0gMQ0KICBwcmludChpKX0NCg0KI05hbWUgcm93cyBhbmQgQ29sdW1ucw0Kcm93bmFtZXMoc3BwX2NvbW1hdCkgPC0gYXMuY2hhcmFjdGVyKHNpdGVzX3N1YikNCmNvbG5hbWVzKHNwcF9jb21tYXQpIDwtIGFzLmNoYXJhY3RlcihzcHBfc3ViKQ0KDQojQ2hhbmdlIG1hdHJpeCBpbnRvIGRhdGFmcmFtZQ0Kc3BwX2NvbW1hdC5kZjwtIGFzLmRhdGEuZnJhbWUoc3BwX2NvbW1hdCkNCg0KI01ha2UgZW1wdHkgcXVhZHJhdHMgdHJ1bHkgZW1wdHkNCnNwcF9jb21tYXQuZGYuZml4ZWQ8LXN1YnNldChzcHBfY29tbWF0LmRmLCBzZWxlY3Q9LWMoRW1wdHkpKQ0KDQojQWRkIHNpdGUgY29sdW1uIGJhY2sgaW4gYW5kIGNoYW5nZSBpdHMgbmFtZQ0KQWxsUG9uZHMgPC0gY2JpbmQoc2l0ZW5hbWVzJFBvbmQsc3BwX2NvbW1hdC5kZi5maXhlZCkNCm5hbWVzKEFsbFBvbmRzKVtuYW1lcyhBbGxQb25kcyk9PSJzaXRlbmFtZXMkUG9uZCJdIDwtICJTaXRlIg0KYGBgDQoNCmBgYHtyIEthYmxlIDEsIGVjaG89RkFMU0V9DQpBbGxQb25kc1RyaW1tZWQ8LXNlbGVjdChBbGxQb25kcywgYygxOjcpKQ0Ka2FibGUoQWxsUG9uZHNUcmltbWVkWzE6NSwgXSwgZm9ybWF0ID0gInBhbmRvYyIsIGZ1bGxfd2lkdGg9RiwgY2FwdGlvbiA9ICdUYWJsZSAxLiBTYW1wbGUgb2YgZGF0YSBpbiBwcmVzZW5jZS1hYnNlbmNlIGZvcm1hdC4nKQ0KYGBgDQoNCg0KIyMgRGl2ZXJzaXR5DQoNCmBgYHtyIFNwbGl0IHNpdGVzLCBpbmNsdWRlPUZBTFNFfQ0KI0JyZWFrIHVwIEFsbFBvbmRzIGludG8gZGF0YWZyYW1lcyBieSBzaXRlDQojVGhlIGZpcnN0IGNvbHVtbiBoYXMgdG8gYmUgcmVtb3ZlZCBmb3IgZWFjaA0KI1RyYW5zcG9zZSB0aGUgZGF0YWZyYW1lcyBzbyBzcGVjaWVzIGFyZSBjb2x1bW5zDQoNClMwMTwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDEpLCAtMSkpDQpTMDI8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyKSwgLTEpKQ0KUzAzPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMyksIC0xKSkNClMwNDwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDQpLCAtMSkpDQpTMDU8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSA1KSwgLTEpKQ0KUzA2PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gNiksIC0xKSkNClMwNzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDcpLCAtMSkpDQpTMDg8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSA4KSwgLTEpKQ0KUzA5PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gOSksIC0xKSkNClMxMDwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDEwKSwgLTEpKQ0KUzExPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTEpLCAtMSkpDQpTMTI8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxMiksIC0xKSkNClMxMzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDEzKSwgLTEpKQ0KUzE0PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTQpLCAtMSkpDQpTMTY8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxNiksIC0xKSkNClMxNzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDE3KSwgLTEpKQ0KUzE4PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTgpLCAtMSkpDQpTMTk8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxOSksIC0xKSkNClMyMDwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDIwKSwgLTEpKQ0KUzIxPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjEpLCAtMSkpDQpTMjI8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyMiksIC0xKSkNClMyMzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDIzKSwgLTEpKQ0KUzI0PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjQpLCAtMSkpDQpTMjU8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyNSksIC0xKSkNClMyNjwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDI2KSwgLTEpKQ0KUzI3PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjcpLCAtMSkpDQpTMjg8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyOCksIC0xKSkNCmBgYA0KDQpgYGB7ciBVbmljb3JuIHZvbWl0IHByZXAsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KI01ha2UgYSBsaXN0IG9mIGFsbCBzaXRlIGRhdGFmcmFtZXMNCnNpdGUubGlzdC5hbGwgPSBsaXN0KFMwMT1TMDEsUzAyPVMwMixTMDM9UzAzLFMwND1TMDQsUzA1PVMwNSxTMDY9UzA2LFMwNz1TMDcsUzA4PVMwOCxTMDk9UzA5LFMxMD1TMTAsUzExPVMxMSxTMTI9UzEyLFMxMz1TMTMsUzE0PVMxNCxTMTY9UzE2LFMxNz1TMTcsUzE4PVMxOCxTMTk9UzE5LFMyMD1TMjAsUzIxPVMyMSxTMjI9UzIyLFMyMz1TMjMsUzI0PVMyNCxTMjU9UzI1LFMyNj1TMjYsUzI3PVMyNyxTMjg9UzI4KQ0KI0NvbnZlcnQgZXZlcnl0aGluZyBpbiBsaXN0IHRvIGluY2lkZW5jZSBmcmVxdWVuY2llcw0Kc2l0ZS5saXN0LmZyZXEuYWxsID0gbGFwcGx5KHNpdGUubGlzdC5hbGwsIGFzLmluY2ZyZXEpDQpgYGANCg0KYGBge3IgVW5pY29ybiB2b21pdCBwcmVwMiwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpvdXQuaW5jLmFsbDwtaU5FWFQoc2l0ZS5saXN0LmZyZXEuYWxsLCBxPTAsIGRhdGF0eXBlPSJpbmNpZGVuY2VfZnJlcSIsIG5ib290PTEwMDAwKQ0KYGBgDQoNCmBgYHtyIEthYmxlIDIsIGluY2x1ZGU9RkFMU0V9DQojVGhlIGlORVhUIG91dHB1dCAoIm91dC5pbmMuYWxsIikgY29udGFpbnMgdGhyZWUgdGFibGVzOyAiQXN5RXN0IiBoYXMgYWxsIHRoZSBkYXRhIHdlIG5lZWQNCiNTYXZlZCBpdCBhcyBhbiBvYmplY3QgYW5kIGNoYW5nZWQgaXQgc28gaXQgd291bGQgYmUgbW9yZSByZWFkYWJsZQ0KUmljaERpdjwtb3V0LmluYy5hbGwkQXN5RXN0DQpSaWNoRGl2VDwtc3Vic2V0KFJpY2hEaXYsIHNlbGVjdD0tYyhzLmUuLCBMQ0wsIFVDTCkpDQpSaWNoRGl2T2JzPC1zdWJzZXQoc3ByZWFkKFJpY2hEaXZULCBEaXZlcnNpdHksIE9ic2VydmVkKSwgc2VsZWN0PS1jKEVzdGltYXRvcikpDQpSaWNoRGl2RXN0PC1zdWJzZXQoc3ByZWFkKFJpY2hEaXZULCBEaXZlcnNpdHksIEVzdGltYXRvciksIHNlbGVjdD0tYyhPYnNlcnZlZCkpDQoNCiNUcmltIGRvd24gY29sdW1uIG5hbWVzIHNvIHRoZXkgZG9uJ3Qgc3Vjaw0KbmFtZXMoUmljaERpdk9icyk8LWMoIlNpdGUiLCAiUmljaG5lc3NPYnMiLCAiU2hhbm5vbk9icyIsICJTaW1wc29uT2JzIikNCm5hbWVzKFJpY2hEaXZFc3QpPC1jKCJTaXRlIiwgIlJpY2huZXNzRXhwIiwgIlNoYW5ub25FeHAiLCAiU2ltcHNvbkV4cCIpDQoNCiNDb2xsYXBzZSBzaXRlczsgaGF2ZSB0byBkbyBmdW5reSB0aGluZ3MgdG8gZGVhbCB3aXRoIE5Bcw0KY29tcHJlc3MgPC0gZnVuY3Rpb24oeCkgYyhuYS5vbWl0KHgpLCBOQSlbMV0NClJpY2hEaXZPYnMuMTwtYWdncmVnYXRlKFJpY2hEaXZPYnNbMjo0XSwgUmljaERpdk9ic1sxXSwgY29tcHJlc3MpDQpSaWNoRGl2RXN0LjE8LWFnZ3JlZ2F0ZShSaWNoRGl2RXN0WzI6NF0sIFJpY2hEaXZFc3RbMV0sIGNvbXByZXNzKQ0KDQojUmVtb3ZlIHNpdGUgY29sdW1uIGZyb20gUmljaERpdkVzdCBzbyBpdCdzIG5vdCBkdXBsaWNhdGVkIHdoZW4gbWVyZ2luZw0KUmljaERpdkVzdC4yPC1zdWJzZXQoUmljaERpdkVzdC4xLCBzZWxlY3Q9LWMoU2l0ZSkpDQoNCiNNZXJnZSBldmVyeWJvZHkgdG9nZXRoZXINClJpY2hEaXZGaW5hbDwtY2JpbmQoUmljaERpdk9icy4xLCBSaWNoRGl2RXN0LjIpDQoNCiNSZW9yZGVyIGNvbHVtbnMgc28gdGhleSBtYWtlIHNlbnNlDQpSaWNoRGl2VGFiPC1SaWNoRGl2RmluYWxbLGMoMSwyLDUsMyw2LDQsNyldDQpSaWNoRGl2S2FiPC1SaWNoRGl2VGFiW2MoMSwgNiwgNywgOCwgMTAsIDI2LCAyNyksXQ0KDQprYWJsZShSaWNoRGl2S2FiWzE6NyxdLCBmb3JtYXQgPSAicGFuZG9jIiwgZnVsbF93aWR0aD1GLCBjYXB0aW9uID0gJ1RhYmxlIDIuIE9ic2VydmVkIGFuZCBleHBlY3RlZCBIaWxsIG51bWJlcnMgZnJvbSBhIHBvcnRpb24gb2YgdGhlIHNpdGVzLicpDQpgYGANCg0KYGBge3IgRXN0IGFuZCBPYnMgUmljaG5lc3MsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KUmljaG5lc3NPbmx5PC1maWx0ZXIoUmljaERpdiwgRGl2ZXJzaXR5ID09ICJTcGVjaWVzIHJpY2huZXNzIikNCmNvbG5hbWVzKFJpY2huZXNzT25seSlbY29sbmFtZXMoUmljaG5lc3NPbmx5KT09IkxDTCJdIDwtICJSaWNoTENMIg0KY29sbmFtZXMoUmljaG5lc3NPbmx5KVtjb2xuYW1lcyhSaWNobmVzc09ubHkpPT0iVUNMIl0gPC0gIlJpY2hVQ0wiDQpjb2xuYW1lcyhSaWNobmVzc09ubHkpW2NvbG5hbWVzKFJpY2huZXNzT25seSk9PSJFc3RpbWF0b3IiXSA8LSAiRXN0aW1hdGVkIg0KUmljaEdhdGg8LWdhdGhlcihSaWNobmVzc09ubHksUmljaG5lc3MsdmFsdWUsT2JzZXJ2ZWQ6RXN0aW1hdGVkKQ0KUmljaFNpemU8LSBjYmluZChSaWNoR2F0aCwgc2l0ZXNpemVzJFF1YWRyYXRzKQ0KY29sbmFtZXMoUmljaFNpemUpW2NvbG5hbWVzKFJpY2hTaXplKT09InNpdGVzaXplcyRRdWFkcmF0cyJdIDwtICJRdWFkcmF0cyINCg0KDQpnZ3Bsb3QoUmljaEdhdGgsIGFlcyh4PVNpdGUsIHk9dmFsdWUsIGNvbG9yPVJpY2huZXNzKSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImRhcmtncmV5IiwgImJsYWNrIikpKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVJpY2hMQ0wsIHltYXg9UmljaFVDTCksIHdpZHRoPS4zLCBjb2xvcj0iZGFya2dyZXkiKSArDQogIGdlb21fcG9pbnQoc2l6ZT0yKSsNCiAgeWxhYigiU3BlY2llcyBSaWNobmVzcyIpKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMjUwKSkrDQogIGdndGl0bGUoIkVzdGltYXRlZCBhbmQgb2JzZXJ2ZWQgc3BlY2llcyByaWNobmVzcyBieSBzaXRlLCB3aXRoIDk1JSBjb25maWRlbmNlIGludGVydmFscy4iKSsNCiAgbGFicyhjYXB0aW9uPSJOb3RlIHRoYXQgdXBwZXIgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgU2l0ZSAyNiBleHRlbmRzIHRvIDI2Mi44IGFuZCBTaXRlIDEwIGV4dGVuZHMgdG8gNDA4LjUyLiIpKw0KICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSkNCmBgYA0KDQpTaXRlcyBoYWQgd2lkZWx5IHZhcnlpbmcgb2JzZXJ2ZWQgdG90YWwgcmljaG5lc3MuIFRoZSB1c2Ugb2YgZXh0cmFwb2xhdGVkIHNwZWNpZXMgYWNjdW11bGF0aW9uIGN1cnZlcyBjYW4gdGVsbCB1cyBob3cgbWFueSBzcGVjaWVzIGFyZSBsaWtlbHkgdG8gYmUgYXQgdGhlIHNpdGUgYmFzZWQgb24gaG93IG1hbnkgd2VyZSBmb3VuZCBpbiBhY2N1bXVsYXRpbmcgc3Vic2FtcGxlcy4gSG93ZXZlciBpZiBhIGN1cnZlIG5ldmVyIGZsYXR0ZW5zLCBpdCBnaXZlcyBhIHdpbGQgZXN0aW1hdGUgb2YgcmljaG5lc3MgKHNlZSBTaXRlIDEwKS4NCg0KV2hhdCBkbyB0aGUgY3VydmVzIHRoYXQgbWFkZSB0aGVzZSBlc3RpbWF0ZXMgbG9vayBsaWtlPyBMZXQncyB0YWtlIGEgbG9vayENCg0KYGBge3IgVW5pY29ybiB2b21pdCwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPVRSVUV9DQpnZ2lORVhUKG91dC5pbmMuYWxsLCB0eXBlPTEsIGNvbG9yLnZhcj0ic2l0ZSIpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSArDQogIHhsYWIoIk51bWJlciBvZiBRdWFkcmF0cyIpICsNCiAgZ2d0aXRsZSgiSW50ZXJwb2xhdGVkIGFuZCBleHRyYXBvbGF0ZWQgcmljaG5lc3MiKSArDQogIGxhYnMoY2FwdGlvbj0iQj0xMDAwMC4iKQ0KYGBgDQoNClRoaXMgcGxvdCBpcyBub3QgcGFydGljdWxhcmx5IGhlbHBmdWwgb3RoZXIgdGhhbiB0byB2aXN1YWxpemUgdGhlIGdlbmVyYWwgc3BhbiBvZiBvYnNlcnZlZCBhbmQgZXhwZWN0ZWQgcmljaG5lc3NlcyBhbmQgc2FtcGxpbmcgZWZmb3J0cy4gRXhhbWluaW5nIHRoZSBjdXJ2ZXMgaW4gcG9ydGlvbnMgb2YgMy00IGlzIG5lY2Vzc2FyeSB0byANCg0KYGBge3IgU21hbGxlciBjdXJ2ZXMgMSwgaW5jbHVkZT1GQUxTRX0NCiNMaXN0IHRoZSBkYXRhZnJhbWVzLCB0aGVuIGNvbnZlcnQgdGhlbSBpbnRvIGluY2lkZW5jZSBmcmVxdWVuY2llcw0KI0kgYnJva2UgdGhlbSBpbnRvIG1hbmFnZWFibGUgY2h1bmtzIHRoYXQgZ3JhcGggbW9yZSBjbGVhcmx5IHRoYW4gZXZlcnl0aGluZyBhdCBvbmNlDQoNCnNpdGUubGlzdC4xID0gbGlzdChTMDM9UzAzLCBTMDg9UzA4LCAgUzA5PVMwOSwgUzI4PVMyOCkNCnNpdGUubGlzdC5mcmVxLjEgPSBsYXBwbHkoc2l0ZS5saXN0LjEsIGFzLmluY2ZyZXEpDQoNCnNpdGUubGlzdC4yID0gbGlzdChTMDE9UzAxLCBTMDI9UzAyLCAgUzExPVMxMSwgUzI3PVMyNykNCnNpdGUubGlzdC5mcmVxLjIgPSBsYXBwbHkoc2l0ZS5saXN0LjIsIGFzLmluY2ZyZXEpDQoNCnNpdGUubGlzdC4zID0gbGlzdChTMTA9UzEwLCBTMTM9UzEzLCBTMTQ9UzE0LCBTMjM9UzIzKQ0Kc2l0ZS5saXN0LmZyZXEuMyA9IGxhcHBseShzaXRlLmxpc3QuMywgYXMuaW5jZnJlcSkNCg0KDQpzaXRlLmxpc3QuNCA9IGxpc3QoUzA1PVMwNSxTMTI9UzEyLCBTMTc9UzE3KQ0Kc2l0ZS5saXN0LmZyZXEuNCA9IGxhcHBseShzaXRlLmxpc3QuNCwgYXMuaW5jZnJlcSkNCg0Kc2l0ZS5saXN0LjUgPSBsaXN0KCBTMTk9UzE5LCBTMjA9UzIwLCBTMjE9UzIxLCBTMjU9UzI1KQ0Kc2l0ZS5saXN0LmZyZXEuNSA9IGxhcHBseShzaXRlLmxpc3QuNSwgYXMuaW5jZnJlcSkNCg0Kc2l0ZS5saXN0LjYgPSBsaXN0KFMwNj1TMDYsIFMxNj1TMTYsIFMyMj1TMjIsIFMyNj1TMjYpDQpzaXRlLmxpc3QuZnJlcS42ID0gbGFwcGx5KHNpdGUubGlzdC42LCBhcy5pbmNmcmVxKQ0KDQpzaXRlLmxpc3QuNyA9IGxpc3QoUzA0PVMwNCwgUzA3PVMwNywgUzE4PVMxOCwgUzI0PVMyNCkNCnNpdGUubGlzdC5mcmVxLjcgPSBsYXBwbHkoc2l0ZS5saXN0LjcsIGFzLmluY2ZyZXEpDQpgYGANCg0KYGBge3IgU21hbGxlciBjdXJ2ZXMgMiwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9NywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY2FjaGU9VFJVRX0NCiNSaWNobmVzcyAocT0wKSwgU2hhbm5vbiBEaXYgKHE9MSksIFNpbXBzb24gRGl2IChxPTIpDQojVXNlIGdyZXk9VFJVRSB0byBtYWtlIGFsbCBsaW5lcyBibGFjaw0Kb3V0LmluYzE8LWlORVhUKHNpdGUubGlzdC5mcmVxLjEsIHE9MCwgZGF0YXR5cGU9ImluY2lkZW5jZV9mcmVxIiwgc2l6ZT1OVUxMLCBuYm9vdD0xMDApDQpBPC1nZ2lORVhUKG91dC5pbmMxLCB0eXBlPTEsIGNvbG9yLnZhcj0ic2l0ZSIpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSArDQogIHhsYWIoIk51bWJlciBvZiBRdWFkcmF0cyIpICsNCiAgbGFicyhjYXB0aW9uPSJCPTEwMC4iKQ0KDQpvdXQuaW5jMjwtaU5FWFQoc2l0ZS5saXN0LmZyZXEuMiwgcT0wLCBkYXRhdHlwZT0iaW5jaWRlbmNlX2ZyZXEiLCBzaXplPU5VTEwsIG5ib290PTEwMCkNCkI8LWdnaU5FWFQob3V0LmluYzIsIHR5cGU9MSwgY29sb3IudmFyPSJzaXRlIikgKyANCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTgpICsNCiAgeWxhYigiU3BlY2llcyBSaWNobmVzcyIpICsNCiAgeGxhYigiTnVtYmVyIG9mIFF1YWRyYXRzIikgKw0KICBsYWJzKGNhcHRpb249IkI9MTAwLiIpDQoNCm91dC5pbmMzPC1pTkVYVChzaXRlLmxpc3QuZnJlcS4zLCBxPTAsIGRhdGF0eXBlPSJpbmNpZGVuY2VfZnJlcSIsIHNpemU9TlVMTCwgbmJvb3Q9MTAwKQ0KQzwtZ2dpTkVYVChvdXQuaW5jMywgdHlwZT0xLCBjb2xvci52YXI9InNpdGUiKSArIA0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxOCkgKw0KICB5bGFiKCJTcGVjaWVzIFJpY2huZXNzIikgKw0KICB4bGFiKCJOdW1iZXIgb2YgUXVhZHJhdHMiKSArDQogIGxhYnMoY2FwdGlvbj0iQj0xMDAuIikNCg0Kb3V0LmluYzQ8LWlORVhUKHNpdGUubGlzdC5mcmVxLjQsIHE9MCwgZGF0YXR5cGU9ImluY2lkZW5jZV9mcmVxIiwgc2l6ZT1OVUxMLCBuYm9vdD0xMDApDQpEPC1nZ2lORVhUKG91dC5pbmM0LCB0eXBlPTEsIGNvbG9yLnZhcj0ic2l0ZSIpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSArDQogIHhsYWIoIk51bWJlciBvZiBRdWFkcmF0cyIpICsNCiAgbGFicyhjYXB0aW9uPSJCPTEwMC4iKQ0KDQpvdXQuaW5jNTwtaU5FWFQoc2l0ZS5saXN0LmZyZXEuNSwgcT0wLCBkYXRhdHlwZT0iaW5jaWRlbmNlX2ZyZXEiLCBzaXplPU5VTEwsIG5ib290PTEwMCkNCkU8LWdnaU5FWFQob3V0LmluYzUsIHR5cGU9MSwgY29sb3IudmFyPSJzaXRlIikgKyANCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTgpICsNCiAgeWxhYigiU3BlY2llcyBSaWNobmVzcyIpICsNCiAgeGxhYigiTnVtYmVyIG9mIFF1YWRyYXRzIikgKw0KICBsYWJzKGNhcHRpb249IkI9MTAwLiIpDQoNCm91dC5pbmM2PC1pTkVYVChzaXRlLmxpc3QuZnJlcS42LCBxPTAsIGRhdGF0eXBlPSJpbmNpZGVuY2VfZnJlcSIsIHNpemU9TlVMTCwgbmJvb3Q9MTAwKQ0KRjwtZ2dpTkVYVChvdXQuaW5jNiwgdHlwZT0xLCBjb2xvci52YXI9InNpdGUiKSArIA0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxOCkgKw0KICB5bGFiKCJTcGVjaWVzIFJpY2huZXNzIikgKw0KICB4bGFiKCJOdW1iZXIgb2YgUXVhZHJhdHMiKSArDQogIGxhYnMoY2FwdGlvbj0iQj0xMDAuIikNCg0Kb3V0LmluYzc8LWlORVhUKHNpdGUubGlzdC5mcmVxLjcsIHE9MCwgZGF0YXR5cGU9ImluY2lkZW5jZV9mcmVxIiwgc2l6ZT1OVUxMLCBuYm9vdD0xMDApDQpHPC1nZ2lORVhUKG91dC5pbmM3LCB0eXBlPTEsIGNvbG9yLnZhcj0ic2l0ZSIpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSArDQogIHhsYWIoIk51bWJlciBvZiBRdWFkcmF0cyIpICsNCiAgbGFicyhjYXB0aW9uPSJCPTEwMC4iKQ0KYGBgDQoNCmBgYHtyIE1hbnkgY3VydmVzIG91dHB1dCwgZmlnLmhlaWdodD0yNSwgZmlnLndpZHRoPTcsIGluY2x1ZGU9RkFMU0V9DQpnZ2FycmFuZ2UoQSwgQiwgQywgRCwgRSwgRiwgRywgbnJvdz03KQ0KYGBgDQogDQpgYGB7ciBEYXRhIHJlYXJyYW5naW5nLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCkludGVydmFsczwtc2VsZWN0KHNsaWNlKFJpY2hHYXRoLCBjKDI4OjU0KSksIGMoUmljaExDTCwgUmljaFVDTCkpDQpSaWNoSW50czwtY2JpbmQoUmljaERpdlRhYiwgSW50ZXJ2YWxzKQ0KUmljaEludHMkUGVyY0NvbXBsZXRlIDwtIFJpY2hJbnRzJFJpY2huZXNzT2JzL1JpY2hJbnRzJFJpY2huZXNzRXhwKjEwMA0KUmljaEludHMkUGVyY0NvbXBsZXRlVTwtIFJpY2hJbnRzJFJpY2huZXNzT2JzL1JpY2hJbnRzJFJpY2hVQ0wqMTAwDQpSaWNoSW50cyRQZXJjQ29tcGxldGVMPC0gUmljaEludHMkUmljaG5lc3NPYnMvUmljaEludHMkUmljaExDTCoxMDANCnNpdGVzaXplcyRRdWFkc0FyZWE8LSBzaXRlc2l6ZXMkUXVhZHJhdHMvKHBpKihzaXRlc2l6ZXMkTGVuZ3RoXjIpKQ0Kc2l0ZXNpemVzJEFyZWE8LShwaSooc2l0ZXNpemVzJExlbmd0aF4yKSkNCiMgDQojIFRISVMgUExPVCBJUyBUUkFTSA0KIyBnZ3Bsb3QoUmljaEludHMsIGFlcyh4PVNpdGUsIHk9UGVyY0NvbXBsZXRlKSkgKw0KIyAgIGdlb21fYmFyKGFlcyh5PXNpdGVzaXplcyRRdWFkcmF0cyx4PVNpdGUpLCBzdGF0PSJpZGVudGl0eSIsIHdpZHRoID0gMC43NSwgZmlsbD0ibGlnaHRncmV5IikrDQojICAgZ2VvbV9wb2ludChzaXplPTIpKw0KIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49UGVyY0NvbXBsZXRlTCwgeW1heD1QZXJjQ29tcGxldGVVKSwgd2lkdGg9LjMpICsNCiMgICB5bGFiKCJPYnNlcnZlZC9FeHBlY3RlZCBSaWNobmVzcyAqIDEwMCIpKw0KIyAgIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4uLCBuYW1lID0gIlF1YWRyYXRzIFNhbXBsZWQiKSkrDQojICAgZ2d0aXRsZSgiQ29tcGxldGlvbiBwZXJjZW50YWdlIGFuZCBzYW1wbGUgc2l6ZSBwZXIgc2l0ZSIpKw0KIyAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpKQ0KYGBgDQoNCmBgYHtyIExNIFNhbXBsaW5nIHN1ZmZpY2llbmN5LCBpbmNsdWRlPUZBTFNFfQ0KbG1SaWNoUXVhZCA8LSBsbShSaWNoSW50cyRQZXJjQ29tcGxldGUgfiBzaXRlc2l6ZXMkUXVhZHNBcmVhKQ0KYXV0b3Bsb3QobG1SaWNoUXVhZCkNCmFSaWNoUXVhZDwtYW5vdmEobG1SaWNoUXVhZCkNCmFSaWNoUXVhZA0KYGBgDQoNClRoZXNlIGN1cnZlcyBpbGx1c3RyYXRlIG5vdCBvbmx5ICp3aGVyZSogdGhlIGZsYXR0ZW5pbmcgcG9pbnQgKGV4cGVjdGVkIHJpY2huZXNzKSBvY2N1cnMsIGJ1dCBhbHNvICpob3cgcXVpY2tseSouIEV4YW1pbmluZyBhIGN1cnZlIGNhbiBhbGxvdyBzb21lb25lIHRvIGVzdGltYXRlIGhvdyBtYW55IG1vcmUgc2FtcGxlcyB3b3VsZCBiZSBuZWVkZWQgdG8gcmVhY2ggdGhhdCBwb2ludCwgaG93ZXZlciBpZiBkb2luZyBzbyBzYW1wbGVzIGEgbGFyZ2VyIGFyZWEgdGhlbiB0aGUgY3VydmUgbWF5IG5ldmVyIGZsYXR0ZW4uIA0KDQpMZXQncyBzZWUgaWYgc2FtcGxpbmcgZWZmb3J0ICgjIHF1YWRyYXRzL2FyZWEgc2FtcGxlZCkgYWZmZWN0ZWQgcGVyY2VudCBlc3RpbWF0ZWQgc2FtcGxpbmcgY29tcGxldGlvbjsgaWYgaXQgZGlkLCB0aGF0IHdvdWxkIGJlIGEgYmlnIHByb2JsZW0gYW5kIEkgd291bGQgaGF2ZSBhIGxvdCBvZiBleHBsYWluaW5nIHRvIGRvIHRvIG15IGNvbW1pdHRlZS4NCg0KYGBge3IgU2FtcGxpbmcgc3VmZmljaWVuY3ksIGVjaG89RkFMU0V9DQpnZ3Bsb3QoUmljaEludHMsIGFlcyh4PXNpdGVzaXplcyRRdWFkc0FyZWEsIHk9UGVyY0NvbXBsZXRlLCBjb2xvcj0iYmxhY2siKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgY29sb3I9ImJsYWNrIikrDQogIGdlb21fdGV4dChsYWJlbD1SaWNoSW50cyRTaXRlLCBjb2xvcj0iYmxhY2siLCBzaXplPTMpKw0KICB5bGFiKCJFc3RpbWF0ZWQgJSBTcGVjaWVzIFNhbXBsZWQiKSsNCiAgeGxhYihleHByZXNzaW9uKFF1YWRyYXRzflNhbXBsZWQvU2l0ZX5BcmVhfihtXjIpKSkrDQogIGdndGl0bGUoIkVzdGltYXRlZCBzYW1wbGluZyBjb21wbGV0aW9uIGRvZXMgbm90IGluY3JlYXNlIHdpdGggc2FtcGxpbmcgZWZmb3J0IikrDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxMDApKSsNCiAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCkpDQpgYGANCg0KVGhlcmUgaXMgbm8gcmVsYXRpb25zaGlwIGJldHdlZW4gc2FtcGxpbmcgZWZmb3J0IGFuZCBjb21wbGV0aW9uIHBlcmNlbnRhZ2UgKHA9YHIgYVJpY2hRdWFkWzEsNV1gKS4gSG93ZXZlciwgbm90ZSB0aGF0IFNpdGVzIDEwIGFuZCAyNiB3ZXJlIGZsYWdnZWQgYXMgb3V0bGllcnMgYnkgdGhlIGF1dG9wbG90IGZ1bmN0aW9uLiBUaGlzIGluYWRlcXVhdGUgc2FtcGxpbmcgaXMgbGlrZWx5IHRoZSByZXN1bHQgb2YgdG9vIGZldyBxdWFkcmF0cyBzYW1wbGVkIGF0IHRoZSB3ZXRsYW5kIGVkZ2UgcmVsYXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHdldGxhbmQuIA0KDQoNCg0KIyMgRXZlbm5lc3MgYW5kIERvbWluYW5jZQ0KDQo8ZmlndXJlPg0KPGltZyBzcmM9IkltYWdlcy9Hb29zZWNyb3BwZWQuanBnIj48L2ZpZ3VyZT48YnI+DQoNCmBgYHtyIFNpdGUgc2l6ZSBhbmQgcmljaG5lc3MsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpxdWFkZGllczwtbWVyZ2Uoc2l0ZXNpemVzLCBSaWNoSW50cywgYnk9IlNpdGUiKQ0KcXVhZGRpZXMkTGF0aXR1ZGUgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocXVhZGRpZXMkTGF0aXR1ZGUpKQ0KDQpnZ3Bsb3QoUmljaEludHMsIGFlcyh4PXNpdGVzaXplcyRBcmVhLCB5PVJpY2hJbnRzJFJpY2huZXNzT2JzKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MikrDQogIHlsYWIoIlNpdGUgcmljaG5lc3MiKSsNCiAgeGxhYihleHByZXNzaW9uKFNpdGV+YXJlYX4obV4yKSkpKw0KICBnZ3RpdGxlKCJTaXRlIGFyZWEgZG9lcyBub3QgaGF2ZSBhIHBvc2l0aXZlIGFmZmVjdCBvbiBzaXRlIHJpY2huZXNzIikrDQogIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpKQ0KYGBgDQoNClRoZXJlIGFwcGVhcnMgdG8gYmUgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzaXRlIHJpY2huZXNzIGFuZCBzaXRlIGFyZWEsIGJ1dCB1bmV4cGVjdGVkbHkgdGhpcyByZWxhdGlvbnNoaXAgYXBwZWFycyB0byBiZSBuZWdhdGl2ZS4gQmVjYXVzZSB0aGUgZGF0YSBhcmUgbGlrZWx5IG5vbi1saW5lYXIsIGEgZ2VuZXJhbGl6ZWQgbGluZWFyIG1vZGVsIHNob3VsZCBiZSB1c2VkIHRvIGFzc2VzcyB0aGlzIHJlbGF0aW9uc2hpcC4NCg0KDQoNCg0KIyMgQ29tbXVuaXRpZXMNCg0KYGBge3IgU29yZW5zZW4gdGltZSwgaW5jbHVkZT1GQUxTRX0NCnN1bTAxPC1yb3dTdW1zKFMwMSkNCnN1bTAyPC1yb3dTdW1zKFMwMikNCnN1bTAzPC1yb3dTdW1zKFMwMykNCnN1bTA0PC1yb3dTdW1zKFMwNCkNCnN1bTA1PC1yb3dTdW1zKFMwNSkNCnN1bTA2PC1yb3dTdW1zKFMwNikNCnN1bTA3PC1yb3dTdW1zKFMwNykNCnN1bTA4PC1yb3dTdW1zKFMwOCkNCnN1bTA5PC1yb3dTdW1zKFMwOSkNCnN1bTEwPC1yb3dTdW1zKFMxMCkNCnN1bTExPC1yb3dTdW1zKFMxMSkNCnN1bTEyPC1yb3dTdW1zKFMxMikNCnN1bTEzPC1yb3dTdW1zKFMxMykNCnN1bTE0PC1yb3dTdW1zKFMxNCkNCnN1bTE2PC1yb3dTdW1zKFMxNikNCnN1bTE3PC1yb3dTdW1zKFMxNykNCnN1bTE4PC1yb3dTdW1zKFMxOCkNCnN1bTE5PC1yb3dTdW1zKFMxOSkNCnN1bTIwPC1yb3dTdW1zKFMyMCkNCnN1bTIxPC1yb3dTdW1zKFMyMSkNCnN1bTIyPC1yb3dTdW1zKFMyMikNCnN1bTIzPC1yb3dTdW1zKFMyMykNCnN1bTI0PC1yb3dTdW1zKFMyNCkNCnN1bTI1PC1yb3dTdW1zKFMyNSkNCnN1bTI2PC1yb3dTdW1zKFMyNikNCnN1bTI3PC1yb3dTdW1zKFMyNykNCnN1bTI4PC1yb3dTdW1zKFMyOCkNCg0Kc3VtbWFyeTwtYXMuZGF0YS5mcmFtZShyYmluZChzdW0wMSwgc3VtMDIsIHN1bTAzLCBzdW0wNCwgc3VtMDUsIHN1bTA2LCBzdW0wNywgc3VtMDgsIHN1bTA5LCBzdW0xMCwgc3VtMTEsIHN1bTEyLCBzdW0xMywgc3VtMTQsIHN1bTE2LCBzdW0xNywgc3VtMTgsIHN1bTE5LCBzdW0yMCwgc3VtMjEsIHN1bTIyLCBzdW0yMywgc3VtMjQsIHN1bTI1LCBzdW0yNiwgc3VtMjcsIHN1bTI4KSkNCnN1bXM8LWNvbFN1bXMoc3VtbWFyeSkNCiNUTyBERUxFVEUgU0lOR0xFVE9OUw0Kc3Vtc3VtczwtcmJpbmQoc3Vtcywgc3VtbWFyeSkNCnJvd25hbWVzKHN1bXN1bXMpWzFdPC0ic3VtIg0Kc3Vtc3VtczEgPSBzdW1zdW1zWyxzdW1zID4gMV0NCm5jb2woc3Vtc3Vtc1ssc3VtcyA9PSAxXSkNCiMyMzUqKiBzaW5nbGV0b25zIQ0KDQojQ29udmVydCB0byBiaW5hcnkNCnN1bXN1bXMxW3N1bXN1bXMxID4gMF0gPC0gMQ0KDQpzdW1zdW1zMjwtc2xpY2Uoc3Vtc3VtczEsIC1jKDEpKQ0KDQojMD1pZGVudGljYWwsIDE9dGhlIG1vc3QgZGlzc2ltaWxhcg0Kc29yZW5zZW48LXZlZ2Rpc3Qoc3Vtc3VtczIsIG1ldGhvZD0iYnJheSIsIGJpbmFyeT1UUlVFLCBkaWFnPVRSVUUsIHVwcGVyPUZBTFNFLCBuYS5ybSA9IEZBTFNFKQ0Kc29yZW5zZW4ubTwtYXMubWF0cml4KHNvcmVuc2VuKQ0Kc29yZW5zZW4ubS50PC1zaWduaWYoc29yZW5zZW4ubSwgZGlnaXRzID0gMykNCmBgYA0KDQpgYGB7ciBEaXN0YW5jZSBNYXRyaXgsIGluY2x1ZGU9RkFMU0V9DQpzaXRlc2l6ZXNnZW88LXNlbGVjdChzaXRlc2l6ZXMsIGMoIlNpdGUiLCAiTGF0aXR1ZGUiLCAiTG9uZ2l0dWRlIikpDQpzaXRlc2l6ZXNnZW8uMTwtc2l0ZXNpemVzZ2VvWyxjKDEsMywyKV0NCnNpdGVzaXplc2dlby4yPC1zaXRlc2l6ZXNnZW8uMVssYygyLDMpXQ0KZGlzdGFuY2UubTwtZGlzdG0oc2l0ZXNpemVzZ2VvLjIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNUaGlzIGlzIHJlYWxseSBzbG9wcHkNCnNvcmVuc2VuY29sPC1hcy5kYXRhLmZyYW1lKHNvcmVuc2VuLm0udCkNCmRpc3RhbmNlY29sPC1hcy5kYXRhLmZyYW1lKGRpc3RhbmNlLm0pDQpzb3JlbnNlbm1lbHQ8LW1lbHQoc29yZW5zZW5jb2wsIHZhcmlhYmxlLm5hbWUgPSAnU29yZW5zZW4nKQ0KZ2VvZ3JhcGhpY21lbHQ8LW1lbHQoZGlzdGFuY2Vjb2wsIHZhcmlhYmxlLm5hbWUgPSAnR2VvZ3JhcGhpYycpDQpkaXN0YW5jZS4xPC1jYmluZChnZW9ncmFwaGljbWVsdCwgc29yZW5zZW5tZWx0KQ0KbmFtZXMoZGlzdGFuY2UuMSk8LWMoIlZhcjEiLCAiZ2VvZ3JhcGhpYyIsICJWYXIyIiwgIlNvcmVuc2VuIikNCiNSZW1vdmUgemVybydzIGJlY2F1c2UgdGhleSBvY2N1ciB3aHdlcmUgc2l0ZXMgbWF0Y2gNCmRpc3RhbmNlLmY8LWZpbHRlcihkaXN0YW5jZS4xLCBnZW9ncmFwaGljID4gMCkNCmBgYA0KDQpgYGB7ciBOTURTIHByZXAsIGluY2x1ZGU9RkFMU0V9DQpzb3JlbnNlbi5ubWRzMDEgPC0gbWV0YU1EUyhzb3JlbnNlbiwgaz0xMCkNCnNvcnN0cmVzc3Bsb3Q8LXN0cmVzc3Bsb3Qoc29yZW5zZW4ubm1kczAxKQ0KDQpgYGANCg0KDQpgYGB7ciBOTURTLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY2x1c3RlcjwtaGNsdXN0KHNvcmVuc2VuLCBtZXRob2Q9ImF2ZXJhZ2UiKQ0KZ3JwPC1jdXRyZWUoY2x1c3Rlciw2KQ0KcGxvdChzb3JlbnNlbi5ubWRzMDEsIHR5cGU9InRleHQiKQ0Kb3JkaWNsdXN0ZXIoc29yZW5zZW4ubm1kczAxLCBjbHVzdGVyLCBwcnVuZSA9IDcsIGRpc3BsYXkgPSAic2l0ZXMiLA0KICAgICAgICAgdyA9IHdlaWdodHMoc29yZW5zZW4ubm1kczAxLCBkaXNwbGF5KSkNCiMgb3JkaWVsbGlwc2Uoc29yZW5zZW4ubm1kczAxLCBncm91cD1ncnAsIGRpc3BsYXk9InNpdGVzIiwga2luZD1jKCJzZCIpLCBkcmF3PSJsaW5lcyIsIGNvbmY9MC45NSwgbHdkPTIuNiwgY29sPSJncmV5NDQiKQ0KYGBgDQoNCiMjIyBXaGljaCBzaXRlcyBhcmUgc2ltaWxhcj8NCg0KVGhlcmUgbWF5IGJlIGEgbG90IG9mIG92ZXJsYXAgaW4gY2x1c3RlcnMgZHVlIHRvIHRoZSBuZXN0ZWRuZXNzIG9mIHNvbWUgY29tbXVuaXR5IHR5cGVzLiBXZSBzaG91bGQgcmV2aXNpdCB0aGlzIGxhdGVyIHVzaW5nIHF1YWRyYXRzIGFzIHJlcGxpY2F0ZXMuDQoNCiMjIyBBcmUgc2l0ZXMgc2ltaWxhciBiZWNhdXNlIHRoZXkncmUgZ2VvZ3JhcGhpY2FsbHkgY2xvc2VyPw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KGRpc3RhbmNlLmYsIGFlcyh4PWRpc3RhbmNlLmYkZ2VvZ3JhcGhpYywgeT1kaXN0YW5jZS5mJFNvcmVuc2VuKSkgKw0KICBnZW9tX3BvaW50KCkrDQogIGdlb21fc21vb3RoKG1ldGhvZD0iZ2xtIiwgbWV0aG9kLmFyZ3M9bGlzdChmYW1pbHk9ImJpbm9taWFsIihsaW5rPSJsb2dpdCIpKSkrDQogIHlsYWIoIlNvcmVuc2VuIGRpc3NpbWlsYXJpdHkgaW5kZXgiKSsNCiAgeGxhYigiR2VvZ3JhcGhpYyBkaXN0YW5jZSAobSkiKSsNCiAgZ2d0aXRsZSgiR2VvZ3JhcGhpYyBkaXN0YW5jZSBiZXR3ZWVuIHNpdGVzIGhhcyBubyBlZmZlY3Qgb24gc3BlY2llcyBzaW1pbGFyaXR5IikrDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkaXN0YW5jZS5nbG08LWdsbShTb3JlbnNlbn5nZW9ncmFwaGljLCBmYW1pbHk9Ymlub21pYWwsIGRhdGE9ZGlzdGFuY2UuZikNCnN1bW1hcnkoZGlzdGFuY2UuZ2xtKQ0KYGBgDQoNCk9yZGluYXRpb25zDQoNCiMjIEltcGxpY2F0aW9ucw0KDQpQbGFudCBjb21tdW5pdGllcyBhcmVuJ3QgcmVhbC4gV2UgY2FuIGFsbCBnbyBob21lIG5vdy4NCg==